
const {ccclass, property} = cc._decorator;

interface rangexy {
    min:number, 
    max:number
}

@ccclass
export default class Main extends cc.Component {

    @property(cc.Prefab)
    starPrefab:cc.Prefab = null;

    // 星星产生后消失时间的随机范围
    @property
    maxStarDuration:number = 0;
    @property
    minStarDuration:number = 0;

    // 地面节点， 用于确定星星生成的高度
    @property(cc.Node)
    ground: cc.Node = null;

    // Player 节点，用于获取主角弹跳的高度，和控制主角行动开关
    @property(cc.Node)
    player: cc.Node = null;

    // LIFE-CYCLE CALLBACKS:
    private groundY:number = 0;

    // 得分的引用
    @property(cc.Label)
    scoreDisplay:cc.Label = null;
    // 得分
    private score:number = 0;
    // 星星存在时间
    starDuration:number = 0;
    timer:number = 0;

    // 跳跃音效
    @property(cc.AudioClip)
    scoreAudio:cc.AudioClip = null;
    
    private flag:boolean = false;

    onLoad () {
        // 获取地平面的 y 轴坐标
        this.groundY = this.ground.y + this.ground.height/2;
        // 生成一个新的星星
        this.spawnNewStar();
        
        
        this.score = 0;
    }

    start () {

    }

    spawnNewStar() {
        // 使用给定的模板在场景中生成一个新节点
        let newStar:cc.Node = cc.instantiate(this.starPrefab);
        // 将新增的节点添加到 Canvas 节点下面
        this.node.addChild(newStar);
        // 为星星设置一个随机位置
        newStar.setPosition(this.getNewStarPosition(newStar));
        // 在星星脚本组件上保存 Game 对象的引用
        newStar.getComponent('Star').game = this;

        // 重置计时器，根据消失时间范围随机取一个值
        this.starDuration = this.minStarDuration + Math.random() * (this.maxStarDuration - this.minStarDuration);
        // console.log(this.starDuration);
        
        this.timer = 0;
    }

    private randRange(range:rangexy):number {
        return Math.random()*(range.max - range.min + 1) + range.min; 
    }

    getNewStarPosition(star:cc.Node) {
        // 根据地平面位置和主角跳跃高度，随机得到一个星星的 y 坐标
        let randY:number = this.groundY + Math.random() * this.player.getComponent('Player').jumpHeight + 50;
        // 根据屏幕宽度，随机得到一个星星 x 坐标
        let maxX:number = (cc.winSize.width - 2 * star.width)/2, x:number = this.player.getPosition().x;
        let arr:rangexy[] = [{min:-maxX,max: x - 45}, {min:x + 45,max: maxX}];
        let rate = (x - 45 + maxX)/(2 * maxX - 90);
        let ranx:number = Math.random(),randX:number;
        if (ranx <= rate) {
            randX = this.randRange(arr[0]);
        } else {
            randX = this.randRange(arr[1]);
        }
        // 返回星星坐标
        return cc.v2(randX, randY);
    }
    // 游戏得分更新
    gainScore() {
        this.score += 1;
        // 更新 scoreDisplay Label 的文字
        this.scoreDisplay.string = 'Score: ' + this.score;

        cc.audioEngine.playEffect(this.scoreAudio, false);
    }

    // 游戏结束，重新加载场景
    gameOver() {
        // 停止 Player 节点的跳跃动作
        this.player.stopAllActions(); 
        // 重新加载场景 game
        cc.director.loadScene('Game0');
    }
    update (dt) {
        // 每帧更新计时器，超过限度还没有生成新的星星
        // 就会调用游戏失败逻辑
        if (this.timer > this.starDuration) {
            // if (!this.flag) {
            //     console.log(this.starDuration);
                
            //     this.flag = true;
            // }
            // console.log(this.starDuration + '--');
            // this.gameOver();
            // return;
        }

        this.timer += dt;
    }
}
